// tapable 是一个类似于 Node.js 中的 EventEmitter 的库，但更专注于自定义事件的触发和处理
// webpack 通过 tapable 将实现与流程解耦，所有具体实现通过插件的形式存在

// let { SyncHook } = require('tapable')
// console.log(SyncHook)

class SyncHook{
    constructor(args) {
        this.args = args
        this.taps = []
    }
    
    tap(name,fn){
        this.taps.push(fn)
    }
    call(){
        let args = Array.prototype.slice.call(arguments,0,this.args.length)
        this.taps.forEach((tap)=>tap(...args))
    }
}

let hook = new SyncHook(['name'])
hook.tap('click',(name)=>{ //监听
    console.log('clicked',name) //clicked ikki
})
hook.call('ikki','haha ') //触发